package com.zhentao.service;

import com.zhentao.pojo.StudentClassTeacherDTO;
import com.zhentao.pojo.TcClass;
import com.zhentao.pojo.ClassUserDTO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
* @author 86137
* @description 针对表【tc_class(班级信息表)】的数据库操作Service
* @createDate 2025-09-26 14:31:58
*/
public interface TcClassService extends IService<TcClass> {

    /**
     * 根据班级ID获取班级及其用户信息
     * @param classId 班级ID
     * @return 班级用户关联信息
     */
    ClassUserDTO getClassWithUsers(Integer classId);

    /**
     * 获取所有班级及其用户信息
     * @return 所有班级用户关联信息列表
     */
    List<ClassUserDTO> getAllClassesWithUsers();

    /**
     * 根据创建者ID获取班级及其用户信息
     * @param creatorUserId 创建者用户ID
     * @return 班级用户关联信息列表
     */
    List<ClassUserDTO> getMyClassesWithUsers(Integer creatorUserId);

    /**
     * 根据班级ID获取班级用户统计信息
     * @param classId 班级ID
     * @return 统计信息Map
     */
    Map<String, Object> getClassUserStatistics(Integer classId);

    /**
     * 测试关联查询 - 获取原始数据
     * @param classId 班级ID
     * @return 原始查询结果
     */
    List<Map<String, Object>> getClassWithUsersRaw(Integer classId);

    /**
     * 根据WxUser的classId查找TcClass班级数据
     * @param classId 班级ID
     * @return 班级信息
     */
    TcClass getClassByClassId(Integer classId);

    /**
     * 根据WxUser的classId列表批量查找TcClass班级数据
     * @param classIds 班级ID列表
     * @return 班级信息列表
     */
    List<TcClass> getClassesByClassIds(List<Integer> classIds);

    // ==================== 三表联查：学生-班级-教师 ====================
    
    /**
     * 三表联查：根据学生ID获取学生-班级-教师信息
     * @param studentId 学生ID
     * @return 学生班级教师关联信息
     */
    StudentClassTeacherDTO getStudentClassTeacherByStudentId(Long studentId);

    /**
     * 三表联查：根据班级ID获取该班级所有学生及其教师信息
     * @param classId 班级ID
     * @return 班级学生教师关联信息列表
     */
    List<StudentClassTeacherDTO> getStudentClassTeacherByClassId(Integer classId);

    /**
     * 三表联查：根据教师ID获取该教师所教班级的所有学生信息
     * @param teacherId 教师ID
     * @return 教师班级学生关联信息列表
     */
    List<StudentClassTeacherDTO> getStudentClassTeacherByTeacherId(Integer teacherId);

    /**
     * 三表联查：获取所有学生-班级-教师关联信息
     * @return 所有学生班级教师关联信息列表
     */
    List<StudentClassTeacherDTO> getAllStudentClassTeacher();

    /**
     * 三表联查：根据条件搜索学生-班级-教师信息
     * @param keyword 搜索关键词
     * @param grade 年级
     * @param subject 科目
     * @return 搜索结果列表
     */
    List<StudentClassTeacherDTO> searchStudentClassTeacher(String keyword, String grade, String subject);

    // ==================== 双表联查：用户-班级 ====================
    
    /**
     * 双表联查：查询所有用户及其班级信息
     * @return 所有用户及其班级信息列表
     */
    List<Map<String, Object>> getAllUserWithClass();

    /**
     * 双表联查：查询所有学生及其班级信息
     * @return 所有学生及其班级信息列表
     */
    List<Map<String, Object>> getAllStudentWithClass();

    /**
     * 双表联查：根据班级ID查询该班级所有用户及其班级信息
     * @param classId 班级ID
     * @return 该班级所有用户及其班级信息列表
     */
    List<Map<String, Object>> getClassUsersWithClass(Integer classId);

    /**
     * 双表联查：根据班级ID查询该班级所有学生及其班级信息
     * @param classId 班级ID
     * @return 该班级所有学生及其班级信息列表
     */
    List<Map<String, Object>> getClassStudentsWithClass(Integer classId);

    List<Map<String, Object>> testWxUserTable();

    List<Map<String, Object>> testLeftJoin();
}
